/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class RateioTransferenciaBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Cautela selectedCautela;
    private CautelaAcionista selectedCautelaAcionista;
    private List<Cliente> lazyModel;
    private CautelaEao CautelaJpa;
    private CautelaAcionistaEao CautelaAcionistaJpa;
    private List<Cautela> CautelaList;
    private List<CautelaAcionista> CautelaAcionistaList;
    private LazyDataModel<Cautela> lazyModelEdital;
    private ClienteEao clienteJpa;
    private TipoTransferencia selectedTipoTransferencia;
    private TipoTransferenciaEao tipoTransferenciaJpa;
    private Livro selectedLivro;
    private LivroEao livroJpa;
    private List<Cliente> selectedClientes;
    private List<Cliente> clienteList;
    private List<Cliente> clienteListCheck;
    private Cliente selectedCliente;
    private Cliente clienteTrans;
    private Cliente cliente;
    private Cliente clienteTemp;
    private Cliente clienteTransferencia;
    private FacesMessage msg = null;
    private String dataatual;
    private Funcoes funcoes = new Funcoes();
    private EntityManager sessao;
    private int nTotalReg;
    private BigDecimal vlrUnit;
    private BigDecimal vlrTotal;
    private BigDecimal totTrans;
    private BigDecimal totPartic;
    private BigDecimal totProposta;
    private BigDecimal totQdeRateio;
    private BigDecimal totPercRateio;
    private BigDecimal totVlrRateio;
    private BigDecimal totQdeFinal;
    private BigDecimal totPercFinal;
    private BigDecimal totVlrFinal;
    private String cTotPartic;
    private String cTotProposta;
    private String cTotQdeRateio;
    private String cTotPercRateio;
    private String cTotVlrRateio;
    private String cTotQdeFinal;
    private String cTotPercFinal;
    private String cTotVlrFinal;
    private String numEdital;
    private int idCedente;
    private int idTipo;
    private int idEdital;
    private int idCautela;
    private Anotacao anotacaoCedente;
    private Anotacao anotacaoCessionario;
    private Empresa selectedEmpresa;
    private EmpresaEao empresaJpa;
    private boolean lPassa;
    private String cSql;
    private boolean disable;
    private Comparator comparator = Collections.reverseOrder();
    private String cTipo = "N";
    private Cliente[] selectedClientesCheck;
    private List<Cliente> selectedCessionariosCheck;
    private ClienteParticipacao selectedClienteParticipacao;
    private ClienteParticipacaoPK selectedClienteParticipacaoPK;
    private ClienteParticipacaoEao ClienteParticipacaoJpa;
    private RelatorioCertificado selectedCertificado;
    private RelatorioCertificadoEao relatorioCertificadoJpa;

    public RateioTransferenciaBean() throws EaoException {
        CautelaJpa = CautelaEao.getInstance();
        CautelaAcionistaJpa = CautelaAcionistaEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        livroJpa = LivroEao.getInstance();
        tipoTransferenciaJpa = TipoTransferenciaEao.getInstance();
        empresaJpa = EmpresaEao.getInstance();
        ClienteParticipacaoJpa = ClienteParticipacaoEao.getInstance();
        relatorioCertificadoJpa = RelatorioCertificadoEao.getInstance();

        selectedCliente = new Cliente();
        clienteTrans = new Cliente();
        cliente = new Cliente();
        clienteTemp = new Cliente();
        clienteTransferencia = new Cliente();
        selectedEmpresa = new Empresa();
        selectedEmpresa = new Empresa();

        selectedLivro = new Livro();
        selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(1);
        selectedClientes = new ArrayList<Cliente>();
        selectedCautela = new Cautela();
        selectedCautelaAcionista = new CautelaAcionista();
        dataatual = funcoes.ConverteDateString(new Date());

        cTipo = "N";

        totTrans = BigDecimal.ZERO;
        vlrUnit = BigDecimal.ZERO;
        vlrTotal = BigDecimal.ZERO;

        totPartic = BigDecimal.ZERO;
        totProposta = BigDecimal.ZERO;
        totQdeRateio = BigDecimal.ZERO;
        totPercRateio = BigDecimal.ZERO;
        totVlrRateio = BigDecimal.ZERO;
        totQdeFinal = BigDecimal.ZERO;
        totPercFinal = BigDecimal.ZERO;
        totVlrFinal = BigDecimal.ZERO;

        cTotPartic = "0,0000";
        cTotProposta = "0";
        cTotQdeRateio = "0";
        cTotPercRateio = "0,0000";
        cTotVlrRateio = "0,00";
        cTotQdeFinal = "0";
        cTotPercFinal = "0,0000";
        cTotVlrFinal = "0,00";

        lPassa = true;
        disable = true;

        // Grid Intencao de compra
        cliente = new Cliente();

        cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                + "from livro "
                + "where dat_fechamento is null";
        this.selectedLivro = livroJpa.getNativeFiltro(cSql);

        // Grid Transferencia
        lazyModelEdital = new LazyDataModel<Cautela>() {

            @Override
            public List<Cautela> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<Cautela> lazyCautela = new ArrayList<Cautela>();

                try {
                    lazyCautela = CautelaJpa.getNative("Cautela", first, pageSize, sortField, sortOrder, filters, null, "id_tipo = 1 ");
                } catch (Exception ex) {
                    Logger.getLogger(RateioTransferenciaBean.class.getName()).log(Level.SEVERE, null, ex);
                }
                /*
                 * for (int i = 0; i < lazyCautela.size(); i++) {
                 * selectedCautela cSql = " id_cautela = "
                 * selectedCautelaAcionista }
                 *
                 *
                 */
                return lazyCautela;
            }
        };

        nTotalReg = CautelaJpa.getCount("Cautela");
        if (nTotalReg == 0) {
            nTotalReg = 1;
            selectedCautela = new Cautela();
        }
        lazyModelEdital.setRowCount(nTotalReg);

        // Grid escolha Cessionarios
        lazyModel = clienteJpa.getNative("Cliente", 0, clienteJpa.getCount("Cliente"), "nomCliente", true, null, null);

        novo();
    }

    public void inserirTransferencia(ActionEvent actionEvent) throws EaoException {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        lPassa = true;
        boolean lFechar = false;

        try {
            verificaValorTransferencia(actionEvent);

            if (this.clienteList == null) {
                this.clienteList = new ArrayList<Cliente>();
            }

            BigDecimal nTotalTransferencia = BigDecimal.ZERO;
            for (int i = 0; i < clienteList.size(); i++) {
                clienteTemp = new Cliente();
                clienteTemp = clienteList.get(i);
                nTotalTransferencia = nTotalTransferencia.add(clienteTemp.getQdeFinal());
            }

            if (nTotalTransferencia.compareTo(this.totTrans) > 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Qde. Total Maior que a Qde. Ofertada!", "");
            }

            if (lPassa) {
                cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                        + "from livro "
                        + "where dat_fechamento is null";
                this.selectedLivro = livroJpa.getNativeFiltro(cSql);

                selectedEmpresa = empresaJpa.getPorId(1);

                BigDecimal nNumTransferencia = selectedEmpresa.getNumTransferencia();
                BigDecimal nNumCertificado = selectedEmpresa.getNumCertificado();

                CautelaList = new ArrayList<Cautela>();

                this.sessao = CautelaJpa.openSessaoLote();
                CautelaJpa.openTransaction(this.sessao);

                this.cliente.setIdCliente(idCedente);
                this.anotacaoCedente = new Anotacao();
                this.anotacaoCessionario = new Anotacao();

                anotacaoCedente.setIdAnotacao(3);
                anotacaoCessionario.setIdAnotacao(2);

                // Grava Transferencia do Cessionario
                for (int i = 0; i < clienteList.size(); i++) {
                    nNumTransferencia = nNumTransferencia.add(new BigDecimal(1));

                    // Pega o Cessionario
                    clienteTrans = new Cliente();
                    clienteTrans = clienteList.get(i);

                    // Atualiza o saldo atual do Cedente
                    BigDecimal nTotal = cliente.getQdeAcao().subtract(clienteTrans.getQdeReceb());
                    if (nTotal.compareTo(new BigDecimal(0)) < 0) {
                        nTotal = new BigDecimal(0);
                    }

                    cliente = clienteJpa.getPorId(cliente.getIdCliente(), "S", this.sessao);
                    cliente.setQdeAcao(nTotal);
                    clienteJpa.edit(cliente, "S", this.sessao);

                    // grava Transferencia do Cedente
                    selectedCautela = new Cautela();
                    selectedCautela.setIdCautela(null);
                    selectedCautela.setDatCautela(new Date());
                    selectedCautela.setCautelaAcionistaList(null);
                    selectedCautela.setIdCliente(cliente);
                    selectedCautela.setIdLivro(selectedLivro);
                    selectedCautela.setIdTipo(selectedTipoTransferencia);
                    selectedCautela.setQdeTotal(nTotalTransferencia);
                    selectedCautela.setVlrUnit(vlrUnit);
                    selectedCautela.setNumCautela("0");
                    selectedCautela.setIdAnotacao(anotacaoCedente);
                    selectedCautela.setNumTransferencia(nNumTransferencia);
                    selectedCautela.setNumCertificado(new BigDecimal(0));
                    selectedCautela.setQdeAcao(cliente.getQdeAcao());
                    CautelaJpa.create(selectedCautela, "S", this.sessao);

                    CautelaList.add(selectedCautela);

                    // Atualiza o saldo atual do Cessionario
                    clienteTemp = new Cliente();
                    clienteTemp = clienteJpa.getPorId(clienteTrans.getIdCliente(), "S", this.sessao);
                    clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().add(clienteTrans.getQdeFinal()));
                    clienteJpa.edit(clienteTemp, "S", this.sessao);

                    // Gera Certificado do Cessionario
                    if (clienteTemp.getQdeAcao().compareTo(BigDecimal.ZERO) > 0) {
                        nNumCertificado = nNumCertificado.add(new BigDecimal(1));

                        cSql = "delete from relatorio_certificado where id_cliente = ".concat(clienteTemp.getIdCliente().toString());
                        clienteJpa.executeUpdate(cSql, "S", this.sessao);

                        selectedCertificado = new RelatorioCertificado();
                        selectedCertificado.setIdCautela(null);
                        selectedCertificado.setDatCautela(new Date());
                        selectedCertificado.setIdCliente(clienteTemp);
                        selectedCertificado.setNumCertificado(nNumCertificado);
                        relatorioCertificadoJpa.create(selectedCertificado, "S", this.sessao);

                        clienteTemp.setImpresso(1);
                        clienteJpa.edit(clienteTemp, "S", this.sessao);
                    }

                    // Grava o Cessionario
                    selectedCautelaAcionista = new CautelaAcionista();
                    selectedCautelaAcionista.setIdCautela(selectedCautela);
                    selectedCautelaAcionista.setIdCautelaacionista(null);
                    selectedCautelaAcionista.setIdCliente(clienteTemp);
                    selectedCautelaAcionista.setQdeAcao(clienteTemp.getQdeAcao());
                    selectedCautelaAcionista.setQdeProposta(clienteTrans.getQdeProposta());
                    selectedCautelaAcionista.setQdeReceb(clienteTrans.getQdeReceb());
                    selectedCautelaAcionista.setIdAnotacao(anotacaoCessionario);
                    selectedCautelaAcionista.setNumTransferencia(nNumTransferencia);
                    selectedCautelaAcionista.setDatCautela(new Date());
                    selectedCautelaAcionista.setIdLivro(selectedLivro);
                    selectedCautelaAcionista.setNumCautela("0");
                    selectedCautelaAcionista.setIdCedente(idCedente);
                    selectedCautelaAcionista.setNumCertificado(nNumCertificado);
                    selectedCautelaAcionista.setPercPartic(clienteTemp.getPercPartic());

                    CautelaAcionistaJpa.create(selectedCautelaAcionista, "S", this.sessao);

                    // Atualiza percentual participacao
                    selectedClienteParticipacaoPK = new ClienteParticipacaoPK();
                    selectedClienteParticipacaoPK.setDatPartic(new Date());
                    selectedClienteParticipacaoPK.setIdCliente(clienteTemp.getIdCliente());

                    selectedClienteParticipacao = ClienteParticipacaoJpa.getPorId(selectedClienteParticipacaoPK, "S", this.sessao);

                    if (selectedClienteParticipacao == null) {
                        selectedClienteParticipacao = new ClienteParticipacao();

                        selectedClienteParticipacao.setCliente(clienteTemp);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTemp.getPercPartic());

                        ClienteParticipacaoJpa.create(selectedClienteParticipacao, "S", this.sessao);

                        selectedClienteParticipacao = null;
                    } else {
                        selectedCliente = clienteJpa.getPorId(clienteTemp.getIdCliente(), "S", this.sessao);

                        selectedClienteParticipacao.setCliente(clienteTemp);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTemp.getPercPartic());

                        ClienteParticipacaoJpa.edit(selectedClienteParticipacao, "S", this.sessao);
                    }
                }

                // Gera Certificado do Cedente
                if (cliente.getQdeAcao().compareTo(BigDecimal.ZERO) > 0) {
                    nNumCertificado = nNumCertificado.add(new BigDecimal(1));

                    cSql = "delete from relatorio_certificado where id_cliente = ".concat(cliente.getIdCliente().toString());
                    clienteJpa.executeUpdate(cSql, "S", this.sessao);

                    selectedCertificado = new RelatorioCertificado();
                    selectedCertificado.setIdCautela(null);
                    selectedCertificado.setDatCautela(new Date());
                    selectedCertificado.setIdCliente(cliente);
                    selectedCertificado.setNumCertificado(nNumCertificado);
                    relatorioCertificadoJpa.create(selectedCertificado, "S", this.sessao);

                    cliente.setImpresso(1);
                    clienteJpa.edit(cliente, "S", this.sessao);

                    for (int i = 0; i < CautelaList.size(); i++) {
                        selectedCautela = CautelaList.get(i);
                        selectedCautela.setNumCertificado(nNumCertificado);
                        selectedCautela.setQdeAcao(cliente.getQdeAcao());
                        CautelaJpa.edit(selectedCautela, "S", this.sessao);
                    }
                } else {
                    for (int i = 0; i < CautelaList.size(); i++) {
                        selectedCautela = CautelaList.get(i);
                        selectedCautela.setNumCertificado(new BigDecimal(0));
                        selectedCautela.setQdeAcao(cliente.getQdeAcao());
                        CautelaJpa.edit(selectedCautela, "S", this.sessao);
                    }
                }

                selectedEmpresa.setNumTransferencia(nNumTransferencia);
                selectedEmpresa.setNumCertificado(nNumCertificado);
                empresaJpa.edit(selectedEmpresa, "S", this.sessao);

                CautelaJpa.closeTransaction(this.sessao);

                // Atualiza os percetuais de participacao
                selectedEmpresa = empresaJpa.getPorId(1);
                String cSql = "update cliente "
                        + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");

                clienteJpa.executeUpdate(cSql);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Inclusão da Transferência efetuada com Sucesso!", "");
            }
        } catch (Exception ex) {
            if (this.sessao.isOpen()) {
                try {
                    CautelaJpa.closeSessaoRollback(this.sessao);
                } catch (Exception ex2) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Verifique se a Transferência já Existe!", "");
                }
            }
            lPassa = false;
            novo();
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Verifique se a Transferência já Existe!", "");
        } finally {
            this.sessao = null;
            if (lPassa) {
                novo();
                lFechar = true;
            }
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }
    }

    public void excluirTransferencia(ActionEvent actionEvent) throws EaoException {
        msg = null;
        lPassa = true;

        try {
            if (idCautela > 0) {
                this.sessao = CautelaJpa.openSessaoLote();
                CautelaJpa.openTransaction(this.sessao);

                selectedCautela = CautelaJpa.getPorId(idCautela, "S", this.sessao);

                String cFiltro = " id_cautela = ".concat(selectedCautela.getIdCautela().toString());

                for (int i = 0; i < clienteList.size(); i++) {
                    clienteTrans = new Cliente();
                    clienteTrans = clienteList.get(i);

                    // Atualiza o saldo atual Cedente
                    cliente = clienteJpa.getPorId(selectedCautela.getIdCliente().getIdCliente(), "S", this.sessao);
                    cliente.setQdeAcao(cliente.getQdeAcao().add(clienteTrans.getQdeReceb()));
                    cliente.setImpresso(0);
                    clienteJpa.edit(cliente, "S", this.sessao);

                    // Atualiza o saldo atual Cessionario
                    cliente = new Cliente();
                    cliente = clienteJpa.getPorId(clienteTrans.getIdCliente(), "S", this.sessao);
                    cliente.setQdeAcao(cliente.getQdeAcao().subtract(clienteTrans.getQdeReceb()));
                    cliente.setImpresso(0);
                    clienteJpa.edit(cliente, "S", this.sessao);
                }

                String cSql = "DELETE FROM CAUTELA_ACIONISTA WHERE ".concat(cFiltro);
                CautelaAcionistaJpa.executeUpdate(cSql, "S", sessao);

                cSql = "DELETE FROM CAUTELA WHERE ".concat(cFiltro);
                CautelaJpa.executeUpdate(cSql, "S", this.sessao);

                CautelaJpa.closeTransaction(this.sessao);

                // Atualiza os percetuais de participacao
                selectedEmpresa = empresaJpa.getPorId(1);
                cSql = "update cliente "
                        + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");

                clienteJpa.executeUpdate(cSql);

                // ATUALIZA O PERCETUAL DE PARTICIPACAO
                for (int i = 0; i < clienteList.size(); i++) {
                    clienteTrans = new Cliente();
                    clienteTrans = clienteList.get(i);

                    selectedClienteParticipacaoPK = new ClienteParticipacaoPK();
                    selectedClienteParticipacaoPK.setDatPartic(new Date());
                    selectedClienteParticipacaoPK.setIdCliente(clienteTrans.getIdCliente());

                    selectedClienteParticipacao = ClienteParticipacaoJpa.getPorId(selectedClienteParticipacaoPK);

                    if (selectedClienteParticipacao == null) {
                        selectedClienteParticipacao = new ClienteParticipacao();

                        selectedClienteParticipacao.setCliente(clienteTrans);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTrans.getPercPartic());

                        ClienteParticipacaoJpa.create(selectedClienteParticipacao);

                        selectedClienteParticipacao = null;
                    } else {
                        selectedCliente = clienteJpa.getPorId(clienteTrans.getIdCliente());

                        selectedClienteParticipacao.setCliente(clienteTrans);
                        selectedClienteParticipacao.setClienteParticipacaoPK(selectedClienteParticipacaoPK);
                        selectedClienteParticipacao.setPercPartic(clienteTrans.getPercPartic());

                        ClienteParticipacaoJpa.edit(selectedClienteParticipacao);
                    }
                }

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferência Estornada com Sucesso!", "");
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Estorno da Transferência não efetuada!", "");
            }
        } catch (Exception e) {
            lPassa = false;
            if (this.sessao.isOpen()) {
                CautelaJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro ao Estornar a Transferência!", "");
        } finally {
            this.sessao = null;
            novo();
            FacesContext.getCurrentInstance().addMessage(null, msg);

        }
    }

    public void novo() {
        this.idCedente = 0;
        this.idEdital = 0;
        this.idCautela = 0;
        this.idTipo = 0;
        this.disable = true;

        totTrans = BigDecimal.ZERO;
        vlrUnit = BigDecimal.ZERO;
        vlrTotal = BigDecimal.ZERO;

        totPartic = BigDecimal.ZERO;
        totProposta = BigDecimal.ZERO;
        totQdeRateio = BigDecimal.ZERO;
        totPercRateio = BigDecimal.ZERO;
        totVlrRateio = BigDecimal.ZERO;
        totQdeFinal = BigDecimal.ZERO;
        totPercFinal = BigDecimal.ZERO;
        totVlrFinal = BigDecimal.ZERO;

        cTotPartic = "0,0000";
        cTotProposta = "0";
        cTotQdeRateio = "0";
        cTotPercRateio = "0,0000";
        cTotVlrRateio = "0,00";
        cTotQdeFinal = "0";
        cTotPercFinal = "0,0000";
        cTotVlrFinal = "0,00";

        this.cliente = new Cliente();
        this.selectedCliente = new Cliente();
        this.clienteTrans = new Cliente();
        this.clienteTemp = new Cliente();

        this.selectedTipoTransferencia = new TipoTransferencia();
        this.selectedLivro = new Livro();
        this.selectedClientes = new ArrayList<Cliente>();

        this.selectedCautela = new Cautela();
        this.selectedCautelaAcionista = new CautelaAcionista();
        this.clienteList = new ArrayList<Cliente>();

        this.anotacaoCedente = new Anotacao();
        this.anotacaoCessionario = new Anotacao();

        this.selectedClientesCheck = null;
        this.selectedCessionariosCheck = null;

        for (int j = 0; j < this.lazyModel.size(); j++) {
            clienteTemp = this.lazyModel.get(j);

            clienteTemp.setQdeProposta(BigDecimal.ZERO);
            clienteTemp.setQdePercProposta(BigDecimal.ZERO);
            clienteTemp.setQdeVlrProposta(BigDecimal.ZERO);

            this.lazyModel.set(j, clienteTemp);
        }

    }

    public void onRowSelectNavigate(SelectEvent event) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        clienteTemp = (Cliente) event.getObject();
        this.idCedente = clienteTemp.getIdCliente();

        msg = null;
        try {
            if (idCedente > 0) {
                cliente = clienteJpa.getPorId(idCedente);
            }

            selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(1);

            if (this.cliente.getQdeAcao().compareTo(BigDecimal.ZERO) == 0) {
                this.cliente = new Cliente();
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Acionista não possui Ações para efetuar Transferências!", "");
            }
        } catch (Exception ex) {
            Logger.getLogger(BairroBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public void onRowSelectNavigateTipoTransf(SelectEvent event) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        msg = null;
        try {
        } catch (Exception ex) {
            Logger.getLogger(BairroBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public void verificaValorTransferencia(ActionEvent event) {
        msg = null;
        String cTipo = "N";

        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        lPassa = true;
        boolean lFechar = true;

        try {
            selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(1);

            if (idCedente > 0) {
                cliente = clienteJpa.getPorId(idCedente);
            }
            /*
             * if (idTipo > 0) { selectedTipoTransferencia =
             * tipoTransferenciaJpa.getPorId(idTipo); }
             *
             */

            if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                this.totTrans = new BigDecimal(map.get("totTrans").replace(".", "").replace(",", "."));
                this.totTrans = this.totTrans.setScale(4, BigDecimal.ROUND_UP);
            }

            if (selectedTipoTransferencia == null || selectedTipoTransferencia.getIdTipo() == null) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Definir o Tipo de Operação!", "");
            } else if (cliente == null || cliente.getIdCliente() == null || cliente.getIdCliente() == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório selecionar Acionista Cedente!", "");
            } else if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Obrigatório Digitar a Qde. de Ações a Transferir!", "");
            } else if (this.cliente.equals(this.clienteTrans)) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Voce não pode Transferir para o mesmo Acionista!", "");
            } else if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Qde. a Transferir não Definida!", "");
            } else if (this.vlrUnit.compareTo(BigDecimal.ZERO) == 0) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Valor Unitário não Definido!", "");
            } else if (this.totTrans.intValue() > this.cliente.getQdeAcao().intValue()) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Saldo Insuficiente para Efetuar a Transfência!", "");
            }


        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro do Sistema... ".concat(ex.getMessage()), "");
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
            if (lPassa) {
                lFechar = false;
            } else {
                this.clienteTrans = new Cliente();
            }
            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }
    }

    public void onRecuperaEdital() {
        SelectEvent event = null;
        onRecuperaEdital(event);
    }

    public void onRecuperaEdital(SelectEvent event) {
        try {
            // RECUPERA DADOS DO ACIONISTA CEDENTE
            this.selectedTipoTransferencia = selectedCautela.getIdTipo();
            this.cliente = selectedCautela.getIdCliente();
            this.selectedLivro = selectedCautela.getIdLivro();
            this.disable = false;

            this.idCedente = cliente.getIdCliente();
            this.idTipo = this.selectedTipoTransferencia.getIdTipo();
            this.idEdital = selectedCautela.getIdCautela();
            this.totTrans = selectedCautela.getQdeTotal();
            this.vlrUnit = BigDecimal.ZERO;
            this.vlrTotal = BigDecimal.ZERO;

            BigDecimal nQde = BigDecimal.ZERO;
            BigDecimal nPerc = BigDecimal.ZERO;
            BigDecimal nVlr = BigDecimal.ZERO;
            BigDecimal nQdeFinal = BigDecimal.ZERO;
            BigDecimal nPercFinal = BigDecimal.ZERO;
            BigDecimal nVlrFinal = BigDecimal.ZERO;

            // RECUPERA DADOS DA TRANSFERENCIA
            String cFiltro = "cautela_acionista.num_transferencia = ".concat(selectedCautela.getNumTransferencia().toString());

            CautelaList = new ArrayList<Cautela>();
            CautelaList = CautelaJpa.getNative("Cautela", 0, 3, null, true, null, null, cFiltro);

            this.clienteList = new ArrayList<Cliente>();

            if (!CautelaList.isEmpty()) {
                totPartic = BigDecimal.ZERO;
                totProposta = BigDecimal.ZERO;
                totQdeRateio = BigDecimal.ZERO;
                totPercRateio = BigDecimal.ZERO;
                totVlrRateio = BigDecimal.ZERO;
                totQdeFinal = BigDecimal.ZERO;
                totPercFinal = BigDecimal.ZERO;
                totVlrFinal = BigDecimal.ZERO;

                cTotPartic = "0,0000";
                cTotProposta = "0";
                cTotQdeRateio = "0";
                cTotPercRateio = "0,0000";
                cTotVlrRateio = "0,00";
                cTotQdeFinal = "0";
                cTotPercFinal = "0,0000";
                cTotVlrFinal = "0,00";

                selectedCautela = CautelaList.get(0);
                idCautela = selectedCautela.getIdCautela();

                this.totTrans = selectedCautela.getQdeTotal();
                this.vlrUnit = selectedCautela.getVlrUnit();
                this.vlrTotal = this.totTrans.multiply(this.vlrUnit);

                CautelaAcionistaList = new ArrayList<CautelaAcionista>();
                CautelaAcionistaList = CautelaAcionistaJpa.getNative("CautelaAcionista", 0, CautelaAcionistaJpa.getCount("CautelaAcionista"), null, true, null, null, cFiltro);

                for (int i = 0; i < CautelaAcionistaList.size(); i++) {
                    nQde = BigDecimal.ZERO;
                    nPerc = BigDecimal.ZERO;
                    nVlr = BigDecimal.ZERO;
                    nQdeFinal = BigDecimal.ZERO;
                    nPercFinal = BigDecimal.ZERO;
                    nVlrFinal = BigDecimal.ZERO;

                    selectedCautelaAcionista = new CautelaAcionista();
                    selectedCautelaAcionista = CautelaAcionistaList.get(i);

                    clienteTemp = new Cliente();
                    clienteTemp = selectedCautelaAcionista.getIdCliente();

                    nQde = selectedCautelaAcionista.getQdeReceb();
                    nPerc = nQde.divide(this.totTrans, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                    if (nPerc.compareTo(BigDecimal.ZERO) == 0) {
                        nPerc = new BigDecimal(0.1000);
                    }
                    nVlr = this.vlrUnit.multiply(nQde).setScale(4, RoundingMode.HALF_UP);
                    //nQde = nQde.setScale(4, RoundingMode.HALF_UP);

                    nQdeFinal = selectedCautelaAcionista.getQdeAcao();
                    nPercFinal = nQdeFinal.divide(this.totTrans, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                    if (nPercFinal.compareTo(BigDecimal.ZERO) == 0) {
                        nPercFinal = new BigDecimal(1.000);
                    } else {
                        nPercFinal = nPercFinal.multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);
                    }
                    nVlrFinal = this.vlrUnit.multiply(nQdeFinal).setScale(4, RoundingMode.HALF_UP);
                    nQdeFinal = nQdeFinal.setScale(4, RoundingMode.HALF_UP);

                    clienteTemp.setQdeProposta(selectedCautelaAcionista.getQdeProposta());
                    clienteTemp.setQdeReceb(nQde);
                    clienteTemp.setQdePerc(nPerc);
                    clienteTemp.setQdeVlr(nVlr);
                    clienteTemp.setQdeFinal(nQdeFinal);
                    clienteTemp.setQdePercFinal(nPercFinal);
                    clienteTemp.setQdeVlrFinal(nVlrFinal);

                    this.clienteList.add(clienteTemp);

                    this.totPartic = this.totPartic.add(clienteTemp.getPercPartic());
                    this.totProposta = this.totProposta.add(selectedCautelaAcionista.getQdeProposta());
                    this.totQdeRateio = this.totQdeRateio.add(nQde);
                    this.totPercRateio = this.totPercRateio.add(nPerc);
                    this.totVlrRateio = this.totVlrRateio.add(nVlr);
                    this.totQdeFinal = this.totQdeFinal.add(nQdeFinal);
                    this.totPercFinal = this.totPercFinal.add(nPercFinal);
                    this.totVlrFinal = this.totVlrFinal.add(nVlrFinal);
                }

                this.cTotPartic = funcoes.FormataValor(this.totPartic, 4);
                this.cTotProposta = funcoes.FormataValor(this.totProposta, 0);
                this.cTotQdeRateio = funcoes.FormataValor(this.totQdeRateio, 0);
                this.cTotPercRateio = funcoes.FormataValor(this.totPercRateio, 4);
                this.cTotVlrRateio = funcoes.FormataValor(this.totVlrRateio, 2);
                this.cTotQdeFinal = funcoes.FormataValor(this.totQdeFinal, 0);
                this.cTotPercFinal = funcoes.FormataValor(this.totPercFinal, 2);
                this.cTotVlrFinal = funcoes.FormataValor(this.totVlrFinal, 2);
            }
        } catch (EaoException ex) {
            Logger.getLogger(RateioTransferenciaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Cliente> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(List<Cliente> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Cautela getSelectedCautela() {
        if (selectedCautela == null) {
            selectedCautela = new Cautela();
        }
        return selectedCautela;
    }

    public void setSelectedCautela(Cautela selectedCautela) {
        this.selectedCautela = selectedCautela;
    }

    public Cliente getSelectedCliente() {
        return selectedCliente;
    }

    public void setSelectedCliente(Cliente selectedCliente) {
        if (selectedCliente == null) {
            selectedCliente = new Cliente();
            selectedCliente.setQdeFinal(BigDecimal.ZERO);
            selectedCliente.setQdePerc(BigDecimal.ZERO);
            selectedCliente.setQdePercFinal(BigDecimal.ZERO);
            selectedCliente.setQdeReceb(BigDecimal.ZERO);
            selectedCliente.setQdeVlr(BigDecimal.ZERO);
            selectedCliente.setQdeVlrFinal(BigDecimal.ZERO);
        }
        this.selectedCliente = selectedCliente;
    }

    public TipoTransferencia getSelectedTipoTransferencia() throws EaoException {
        if (selectedTipoTransferencia == null || selectedTipoTransferencia.getIdTipo() == null) {
            this.selectedTipoTransferencia = tipoTransferenciaJpa.getPorId(1);
        }
        return selectedTipoTransferencia;
    }

    public void setSelectedTipoTransferencia(TipoTransferencia selectedTipoTransferencia) {
        this.selectedTipoTransferencia = selectedTipoTransferencia;
    }

    public Livro getSelectedLivro() {
        if (selectedLivro == null || selectedLivro.getIdLivro() == null) {
            selectedLivro = new Livro();
        }
        return selectedLivro;
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }

    public List<Cliente> getSelectedClientes() {
        return selectedClientes;
    }

    public void setSelectedClientes(List<Cliente> selectedClientes) {
        this.selectedClientes = selectedClientes;
    }

    public List<Cliente> getClienteList() {
        return clienteList;
    }

    public void setClienteList(List<Cliente> clienteList) {
        this.clienteList = clienteList;
    }

    public String getDataatual() {
        return dataatual;
    }

    public void setDataatual(String dataatual) {
        this.dataatual = dataatual;
    }

    public CautelaAcionista getSelectedCautelaAcionista() {
        return selectedCautelaAcionista;
    }

    public void setSelectedCautelaAcionista(CautelaAcionista selectedCautelaAcionista) {
        this.selectedCautelaAcionista = selectedCautelaAcionista;
    }

    public BigDecimal getVlrTotal() {
        return vlrTotal;
    }

    public void setVlrTotal(BigDecimal vlrTotal) {
        this.vlrTotal = vlrTotal;
    }

    public BigDecimal getVlrUnit() {
        return vlrUnit;
    }

    public void setVlrUnit(BigDecimal vlrUnit) {
        this.vlrUnit = vlrUnit;
    }

    public BigDecimal getTotTrans() {
        return totTrans;
    }

    public void setTotTrans(BigDecimal totTrans) {
        this.totTrans = totTrans;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        if (cliente == null) {
            cliente = new Cliente();
        }
        this.cliente = cliente;
    }

    public Cliente getClienteTrans() {
        return clienteTrans;
    }

    public void setClienteTrans(Cliente clienteTrans) {
        this.clienteTrans = clienteTrans;
    }

    public String getNumEdital() {
        return numEdital;
    }

    public void setNumEdital(String numEdital) {
        this.numEdital = numEdital;
    }

    public LazyDataModel<Cautela> getLazyModelEdital() {
        return lazyModelEdital;
    }

    public void setLazyModelEdital(LazyDataModel<Cautela> lazyModelEdital) {
        this.lazyModelEdital = lazyModelEdital;
    }

    public Cliente getClienteTransferencia() {
        return clienteTransferencia;
    }

    public void setClienteTransferencia(Cliente clienteTransferencia) {
        this.clienteTransferencia = clienteTransferencia;
    }

    public EntityManager getSessao() {
        return sessao;
    }

    public void setSessao(EntityManager sessao) {
        this.sessao = sessao;
    }

    public int getIdCedente() {
        return idCedente;
    }

    public void setIdCedente(int idCedente) {
        this.idCedente = idCedente;
    }

    public int getIdTipo() {
        return idTipo;
    }

    public void setIdTipo(int idTipo) {
        this.idTipo = idTipo;
    }

    public int getIdEdital() {
        return idEdital;
    }

    public void setIdEdital(int idEdital) {
        this.idEdital = idEdital;
    }

    public int getIdCautela() {
        return idCautela;
    }

    public void setIdCautela(int idCautela) {
        this.idCautela = idCautela;
    }

    public Anotacao getAnotacaoCedente() {
        return anotacaoCedente;
    }

    public void setAnotacaoCedente(Anotacao anotacaoCedente) {
        this.anotacaoCedente = anotacaoCedente;
    }

    public Anotacao getAnotacaoCessionario() {
        return anotacaoCessionario;
    }

    public void setAnotacaoCessionario(Anotacao anotacaoCessionario) {
        this.anotacaoCessionario = anotacaoCessionario;
    }

    public void onEditRow(ActionEvent event) throws EaoException {
        ActionEvent ActionEvent = null;
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();

        msg = null;
        boolean lFechar = true;
        cTipo = "N";

        try {
            verificaValorTransferencia(ActionEvent);

            if (this.lPassa) {
                this.clienteList = new ArrayList<Cliente>();

                this.totPartic = this.totPartic.setScale(4, RoundingMode.HALF_UP);
                this.totPartic = BigDecimal.ZERO;
                this.totProposta = BigDecimal.ZERO.setScale(4, RoundingMode.DOWN);
                this.totQdeRateio = BigDecimal.ZERO;
                this.totPercRateio = BigDecimal.ZERO;
                this.totVlrRateio = BigDecimal.ZERO;
                this.totQdeFinal = BigDecimal.ZERO;
                this.totPercFinal = BigDecimal.ZERO;
                this.totVlrFinal = BigDecimal.ZERO;

                this.cTotPartic = "0,0000";
                this.cTotProposta = "0";
                this.cTotQdeRateio = "0";
                this.cTotPercRateio = "0,0000";
                this.cTotVlrRateio = "0,00";
                this.cTotQdeFinal = "0";

                // INSERE TODOS OS CESSIONARIOS ESCOLHIDOS
                for (int j = 0; j < lazyModel.size(); j++) {
                    this.clienteTemp = new Cliente();
                    this.clienteTemp = lazyModel.get(j);
                    try {
                        if (this.clienteTemp.getIdCliente() == this.idCedente) {
                            if (clienteTemp.getQdeProposta().compareTo(BigDecimal.ZERO) == 1 || clienteTemp.getQdePercProposta().compareTo(BigDecimal.ZERO) == 1 || clienteTemp.getQdeVlrProposta().compareTo(BigDecimal.ZERO) == 1) {
                                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Um dos Cessionários Selecionados igual ao Cedente!", "");
                            }
                        } else {
                            if (clienteTemp.getQdeProposta().compareTo(BigDecimal.ZERO) == 1 || clienteTemp.getQdePercProposta().compareTo(BigDecimal.ZERO) == 1 || clienteTemp.getQdeVlrProposta().compareTo(BigDecimal.ZERO) == 1) {
                                this.clienteList.add(clienteTemp);

                                this.totPartic = this.totPartic.add(clienteTemp.getPercPartic()).setScale(4, RoundingMode.HALF_UP);
                            }
                        }
                    } catch (Exception ex) {
                        Logger.getLogger(RateioTransferenciaBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

                // CALCULA PROSPOSTA // RATEIO // FINAL
                for (int i = 0; i < clienteList.size(); i++) {
                    clienteTemp = clienteList.get(i);

                    BigDecimal nQdeProposta = BigDecimal.ZERO;
                    BigDecimal nPercProposta = BigDecimal.ZERO;
                    BigDecimal nVlrProposta = BigDecimal.ZERO;

                    BigDecimal nQdeRateio = BigDecimal.ZERO;
                    BigDecimal nPercRateio = BigDecimal.ZERO;
                    BigDecimal nVlrRateio = BigDecimal.ZERO;

                    BigDecimal nQdeFinal = BigDecimal.ZERO;
                    BigDecimal nPercFinal = BigDecimal.ZERO;
                    BigDecimal nVlrFinal = BigDecimal.ZERO;

                    nQdeProposta = this.clienteTemp.getQdeProposta().setScale(4, RoundingMode.DOWN);
                    nPercProposta = this.clienteTemp.getQdePercProposta().setScale(4, RoundingMode.DOWN);
                    nVlrProposta = this.clienteTemp.getQdeVlrProposta().setScale(4, RoundingMode.DOWN);

                    if (nQdeProposta.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "Q";
                    } else if (nPercProposta.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "P";
                    } else if (nVlrProposta.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "V";
                    }

                    if (!cTipo.equals("N")) {
                        if (cTipo.equals("Q")) {
                            nPercProposta = nQdeProposta.divide(this.totTrans, RoundingMode.DOWN).setScale(4, RoundingMode.DOWN);
                            nVlrProposta = this.vlrUnit.multiply(nQdeProposta).setScale(4, RoundingMode.DOWN);
                        } else if (cTipo.equals("P")) {
                            nPercProposta = nPercProposta.divide(new BigDecimal(100), RoundingMode.DOWN).setScale(4, RoundingMode.DOWN);;
                            nQdeProposta = this.totTrans.multiply(nPercProposta).setScale(0, RoundingMode.DOWN);
                            nVlrProposta = this.totTrans.multiply(nPercProposta).multiply(this.vlrUnit).setScale(4, RoundingMode.DOWN);
                        } else if (cTipo.equals("V")) {
                            nQdeProposta = nVlrProposta.divide(this.vlrUnit, RoundingMode.DOWN).setScale(0, RoundingMode.DOWN);
                            nPercProposta = nQdeProposta.divide(this.totTrans, RoundingMode.DOWN).setScale(4, RoundingMode.DOWN);
                        }
                    }

                    // CALCULA RATEIO
                    BigDecimal nPercPartic = this.clienteTemp.getPercPartic();
                    this.totTrans = this.totTrans.setScale(4, RoundingMode.HALF_UP);
                    nQdeRateio = this.totTrans.divide(this.totPartic, RoundingMode.HALF_UP).multiply(nPercPartic).setScale(0, RoundingMode.HALF_UP);

                    nQdeRateio = nQdeRateio.setScale(4, RoundingMode.HALF_UP);
                    nPercRateio = nPercRateio.setScale(4, RoundingMode.HALF_UP);

                    if (nQdeRateio.intValue() <= 0) {
                        nQdeRateio = new BigDecimal(1.0000).setScale(4, RoundingMode.HALF_UP);;
                        nPercRateio = new BigDecimal(0.1000).setScale(4, RoundingMode.HALF_UP);;
                    } else {
                        nPercRateio = nQdeRateio.divide(this.totTrans, RoundingMode.HALF_UP).multiply(new BigDecimal(100.0000)).setScale(4, RoundingMode.HALF_UP);
                    }

                    nVlrRateio = nQdeRateio.multiply(this.vlrUnit).setScale(4, RoundingMode.HALF_UP);;

                    if (nQdeProposta.compareTo(nQdeRateio) == 1) {
                        this.clienteTemp.setQdeFinal(nQdeRateio);
                    } else if (nQdeProposta.compareTo(nQdeRateio) == -1) {
                        this.clienteTemp.setQdeFinal(nQdeProposta);
                    } else {
                        this.clienteTemp.setQdeFinal(nQdeRateio);
                    }

                    // CALCULA FINAL
                    nQdeFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nPercFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nVlrFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                    nQdeFinal = clienteTemp.getQdeFinal();

                    nPercFinal = nQdeFinal.divide(this.totTrans, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                    if (nPercFinal.compareTo(BigDecimal.ZERO) == 0) {
                        nPercFinal = new BigDecimal(0.1000).setScale(4, RoundingMode.HALF_UP);;
                    }
                    nPercFinal = nPercFinal.multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);
                    nVlrFinal = this.vlrUnit.multiply(nQdeFinal).setScale(4, RoundingMode.HALF_UP);

                    this.clienteTemp.setQdeProposta(nQdeProposta);
                    this.clienteTemp.setQdePercProposta(nPercProposta);
                    this.clienteTemp.setQdeVlrProposta(nVlrProposta);
                    this.clienteTemp.setQdeReceb(nQdeRateio);
                    this.clienteTemp.setQdePerc(nPercRateio);
                    this.clienteTemp.setQdeVlr(nVlrRateio);
                    this.clienteTemp.setQdeFinal(nQdeFinal);
                    this.clienteTemp.setQdePercFinal(nPercFinal);
                    this.clienteTemp.setQdeVlrFinal(nVlrFinal);

                    clienteList.set(i, clienteTemp);

                    this.totProposta = this.totProposta.add(this.clienteTemp.getQdeProposta()).setScale(4, RoundingMode.DOWN);;
                    this.totQdeRateio = this.totQdeRateio.add(this.clienteTemp.getQdeReceb()).setScale(4, RoundingMode.HALF_UP);;
                    this.totPercRateio = this.totPercRateio.add(this.clienteTemp.getQdePerc()).setScale(4, RoundingMode.HALF_UP);;
                    this.totVlrRateio = this.totVlrRateio.add(this.clienteTemp.getQdeVlr()).setScale(4, RoundingMode.HALF_UP);;
                    this.totQdeFinal = this.totQdeFinal.add(this.clienteTemp.getQdeFinal()).setScale(4, RoundingMode.HALF_UP);;
                    this.totPercFinal = this.totPercFinal.add(this.clienteTemp.getQdePercFinal()).setScale(4, RoundingMode.HALF_UP);;
                    this.totVlrFinal = this.totVlrFinal.add(this.clienteTemp.getQdeVlrFinal()).setScale(4, RoundingMode.HALF_UP);;
                }

                this.cTotPartic = funcoes.FormataValor(this.totPartic, 4);
                this.cTotProposta = funcoes.FormataValor(this.totProposta, 0);
                this.cTotQdeRateio = funcoes.FormataValor(this.totQdeRateio, 0);
                this.cTotPercRateio = funcoes.FormataValor(this.totPercRateio, 4);
                this.cTotVlrRateio = funcoes.FormataValor(this.totVlrRateio, 2);
                this.cTotQdeFinal = funcoes.FormataValor(this.totQdeFinal, 0);
                this.cTotPercFinal = funcoes.FormataValor(this.totPercFinal, 2);
                this.cTotVlrFinal = funcoes.FormataValor(this.totVlrFinal, 2);

                // LIMPA GRID ESCOLHA CESSIONARIOS
                this.selectedCessionariosCheck = null;
                setSelectedCessionariosCheck(this.selectedCessionariosCheck);
            }
            //lazyModel = clienteJpa.getNative("Cliente", 0, clienteJpa.getCount("Cliente"), "nomCliente", true, null, null);
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro do Sistema... ".concat(ex.getMessage()), "");
        } finally {
            Collections.sort(clienteList, comparator);

            this.clienteTrans = new Cliente();

            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
            if (lPassa) {
                lFechar = false;
            }
            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }

    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }

    public void somaTotal() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        msg = null;

        try {
            BigDecimal nElement = new BigDecimal(map.get("totTrans").replace(".", "").replace(",", "."));

            this.totTrans = nElement;

            if (this.totTrans.compareTo(BigDecimal.ZERO) == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Qde. a Transferir não Definida!", "");
            } else if (this.vlrUnit.compareTo(BigDecimal.ZERO) == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Valor Unitário não Definido!", "");
            }

            this.vlrTotal = this.vlrUnit.multiply(this.totTrans);

//            this.totRest = this.totTrans;
//            this.totPercRest = new BigDecimal(1.00);
//            this.totValorRest = this.vlrTotal;
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Verifique se a Transferência já Existe!", "");
        } finally {
            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public String getcTotPartic() {
        return cTotPartic;
    }

    public void setcTotPartic(String cTotPartic) {
        this.cTotPartic = cTotPartic;
    }

    public String getcTotPercRateio() {
        return cTotPercRateio;
    }

    public void setcTotPercRateio(String cTotPercRateio) {
        this.cTotPercRateio = cTotPercRateio;
    }

    public String getcTotProposta() {
        return cTotProposta;
    }

    public void setcTotProposta(String cTotProposta) {
        this.cTotProposta = cTotProposta;
    }

    public String getcTotQdeRateio() {
        return cTotQdeRateio;
    }

    public void setcTotQdeRateio(String cTotQdeRateio) {
        this.cTotQdeRateio = cTotQdeRateio;
    }

    public String getcTotVlrRateio() {
        return cTotVlrRateio;
    }

    public void setcTotVlrRateio(String cTotVlrRateio) {
        this.cTotVlrRateio = cTotVlrRateio;
    }

    public BigDecimal getTotPartic() {
        return totPartic;
    }

    public void setTotPartic(BigDecimal totPartic) {
        this.totPartic = totPartic;
    }

    public BigDecimal getTotPercRateio() {
        return totPercRateio;
    }

    public void setTotPercRateio(BigDecimal totPercRateio) {
        this.totPercRateio = totPercRateio;
    }

    public BigDecimal getTotProposta() {
        return totProposta;
    }

    public void setTotProposta(BigDecimal totProposta) {
        this.totProposta = totProposta;
    }

    public BigDecimal getTotQdeRateio() {
        return totQdeRateio;
    }

    public void setTotQdeRateio(BigDecimal totQdeRateio) {
        this.totQdeRateio = totQdeRateio;
    }

    public BigDecimal getTotVlrRateio() {
        return totVlrRateio;
    }

    public void setTotVlrRateio(BigDecimal totVlrRateio) {
        this.totVlrRateio = totVlrRateio;
    }

    public String getcTotQdeFinal() {
        return cTotQdeFinal;
    }

    public void setcTotQdeFinal(String cTotQdeFinal) {
        this.cTotQdeFinal = cTotQdeFinal;
    }

    public BigDecimal getTotQdeFinal() {
        return totQdeFinal;
    }

    public void setTotQdeFinal(BigDecimal totQdeFinal) {
        this.totQdeFinal = totQdeFinal;
    }

    public String getcTotPercFinal() {
        return cTotPercFinal;
    }

    public void setcTotPercFinal(String cTotPercFinal) {
        this.cTotPercFinal = cTotPercFinal;
    }

    public String getcTotVlrFinal() {
        return cTotVlrFinal;
    }

    public void setcTotVlrFinal(String cTotVlrFinal) {
        this.cTotVlrFinal = cTotVlrFinal;
    }

    public BigDecimal getTotPercFinal() {
        return totPercFinal;
    }

    public void setTotPercFinal(BigDecimal totPercFinal) {
        this.totPercFinal = totPercFinal;
    }

    public BigDecimal getTotVlrFinal() {
        return totVlrFinal;
    }

    public void setTotVlrFinal(BigDecimal totVlrFinal) {
        this.totVlrFinal = totVlrFinal;
    }

    public Cliente[] getSelectedClientesCheck() {
        return selectedClientesCheck;
    }

    public void setSelectedClientesCheck(Cliente[] selectedClientesCheck) {
        this.selectedClientesCheck = selectedClientesCheck;
    }

    public void recalculaRateio(ActionEvent event) {
        ActionEvent ActionEvent = null;
        RequestContext context = RequestContext.getCurrentInstance();
        FacesContext facesContext = FacesContext.getCurrentInstance();

        boolean lFechar = true;
        cTipo = "N";
        BigDecimal nTotalTemp = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
        BigDecimal nTotalTempRest = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

        try {
            verificaValorTransferencia(ActionEvent);

            if (this.lPassa) {
                clienteListCheck = new ArrayList<Cliente>();

                // RECALCULA QDE. TOTAL
                this.totTrans = this.totTrans.setScale(4, RoundingMode.HALF_UP);
                this.totPercFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                this.totVlrFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                totPartic = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                totProposta = BigDecimal.ZERO.setScale(4, RoundingMode.DOWN);
                totQdeRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                totPercRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                totVlrRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                totQdeFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                cTotPartic = "0,0000";
                cTotProposta = "0";
                cTotQdeRateio = "0";
                cTotPercRateio = "0,0000";
                cTotVlrRateio = "0,00";
                cTotQdeFinal = "0";

                clienteListCheck = clienteList;

                // RETIRA OS MARCADOS E CALCULA O NOVO TOTAL DE PARTICIPACAO
                for (int i = 0; i < selectedClientesCheck.length; i++) {
                    clienteTemp = selectedClientesCheck[i];

                    this.totPartic = this.totPartic.add(clienteTemp.getPercPartic());
                    clienteListCheck.remove(clienteListCheck.indexOf(clienteTemp));
                }
                // SOMA OS TOTAIS RESTANTES
                for (int i = 0; i < clienteListCheck.size(); i++) {
                    clienteTemp = clienteListCheck.get(i);
                    nTotalTempRest = nTotalTempRest.add(clienteTemp.getQdeFinal());
                }
                // REINSERE OS MARCADOS
                clienteListCheck = new ArrayList<Cliente>();
                for (int i = 0; i < selectedClientesCheck.length; i++) {
                    clienteTemp = selectedClientesCheck[i];
                    clienteListCheck.add(clienteTemp);
                }

                nTotalTemp = this.totTrans.subtract(nTotalTempRest);
                nTotalTemp = nTotalTemp.setScale(4);

                BigDecimal nQde = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                BigDecimal nPerc = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                BigDecimal nVlr = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                // REFAZ TODOS OS CALCULOS PARA OS SELECIONADOS
                for (int i = 0; i < clienteListCheck.size(); i++) {
                    clienteTemp = clienteListCheck.get(i);

                    nQde = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nPerc = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nVlr = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                    // CALCULA QDE. PROPOSTA
                    nQde = clienteTemp.getQdeProposta().setScale(4, RoundingMode.DOWN);;
                    nPerc = clienteTemp.getQdePercProposta().setScale(4, RoundingMode.DOWN);;
                    nVlr = clienteTemp.getQdeVlrProposta().setScale(4, RoundingMode.DOWN);;

                    if (nQde.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "Q";
                    } else if (nPerc.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "P";
                    } else if (nVlr.compareTo(BigDecimal.ZERO) != 0) {
                        cTipo = "V";
                    }

                    if (!cTipo.equals("N")) {
                        if (cTipo.equals("Q")) {
                            nPerc = nQde.divide(nTotalTemp, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                            nVlr = this.vlrUnit.multiply(nQde).setScale(4, RoundingMode.HALF_UP);
                        } else if (cTipo.equals("P")) {
                            nPerc = nPerc.divide(new BigDecimal(100), RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                            nQde = nTotalTemp.multiply(nPerc).setScale(4, RoundingMode.HALF_UP);
                            nVlr = nTotalTemp.multiply(nPerc).multiply(this.vlrUnit).setScale(4, RoundingMode.HALF_UP);
                        } else if (cTipo.equals("V")) {
                            nPerc = nVlr.divide(this.vlrTotal, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
                            nQde = nTotalTemp.multiply(nPerc).setScale(4, RoundingMode.HALF_UP);
                        }
                    }

                    this.clienteTemp.setQdeProposta(nQde);
                    this.clienteTemp.setQdePercProposta(nPerc);
                    this.clienteTemp.setQdeVlrProposta(nVlr);

                    // CALCULA A QDE. RATEIO
                    BigDecimal nQdeProposta = BigDecimal.ZERO.setScale(4, RoundingMode.DOWN);

                    this.totProposta = BigDecimal.ZERO.setScale(4, RoundingMode.DOWN);
                    this.totQdeRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    this.totPercRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    this.totVlrRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    this.totQdeFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                    nQde = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nPerc = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
                    nVlr = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

                    BigDecimal nPercPartic = this.clienteTemp.getPercPartic();

                    nQde = nTotalTemp.divide(this.totPartic, RoundingMode.HALF_UP).multiply(nPercPartic).setScale(0, RoundingMode.HALF_UP);

                    nQde = nQde.setScale(4, RoundingMode.HALF_UP);
                    nPerc = nPerc.setScale(4, RoundingMode.HALF_UP);

                    if (nQde.intValue() <= 0) {
                        nQde = new BigDecimal(1.0000);
                        nPerc = new BigDecimal(0.1000);
                    } else {
                        nPerc = nQde.divide(nTotalTemp, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);
                    }

                    nVlr = this.vlrUnit.multiply(nQde).setScale(4, RoundingMode.HALF_UP);;

                    nQdeProposta = clienteTemp.getQdeProposta().setScale(4, RoundingMode.DOWN);

                    if (nQdeProposta.compareTo(nQde) == 1) {
                        this.clienteTemp.setQdeFinal(nQde);
                    } else if (nQdeProposta.compareTo(nQde) == -1) {
                        this.clienteTemp.setQdeFinal(nQdeProposta);
                    } else {
                        this.clienteTemp.setQdeFinal(nQde);
                    }

                    this.clienteTemp.setQdeReceb(nQde);
                    this.clienteTemp.setQdePerc(nPerc);
                    this.clienteTemp.setQdeVlr(nVlr);

                    // RECALCULA QDE. FINAL
                    nQde = BigDecimal.ZERO;
                    nPerc = BigDecimal.ZERO;
                    nVlr = BigDecimal.ZERO;

                    nQde = clienteTemp.getQdeFinal();

                    nPerc = nQde.divide(nTotalTemp, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);
                    if (nPerc.compareTo(BigDecimal.ZERO) == 0) {
                        nPerc = new BigDecimal(0.1000);
                    }
                    nVlr = this.vlrUnit.multiply(nQde).setScale(4, RoundingMode.HALF_UP);

                    this.clienteTemp.setQdeFinal(nQde);
                    this.clienteTemp.setQdePercFinal(nPerc);
                    this.clienteTemp.setQdeVlrFinal(nVlr);

                    clienteListCheck.set(i, clienteTemp);
                }
            }

            // INSERE OS NOVOS CALCULOS
            for (int i = 0; i < clienteListCheck.size(); i++) {
                clienteTemp = clienteListCheck.get(i);

                if (this.clienteList.contains(clienteTemp)) {
                    clienteList.remove(clienteTemp);
                    clienteList.add(clienteTemp);
                } else {
                    clienteList.add(clienteTemp);
                }
            }

            BigDecimal nQdeFinal = BigDecimal.ZERO;
            BigDecimal nVlrFinal = BigDecimal.ZERO;

            BigDecimal nQdeRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
            BigDecimal nQdeRateioFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
            BigDecimal nPercRateio = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);
            BigDecimal nPercRateioFinal = BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP);

            this.totQdeFinal = this.totQdeFinal.setScale(0, RoundingMode.HALF_UP);
            this.totVlrFinal = this.totVlrFinal.setScale(2, RoundingMode.HALF_UP);

            this.vlrUnit = this.vlrUnit.setScale(2, RoundingMode.HALF_UP);

            // RECALCULA OS TOTAIS E OS PERCETUAIS DO RATEIO E FINAL
            for (int i = 0; i < clienteList.size(); i++) {
                clienteTemp = clienteList.get(i);

                nQdeRateio = clienteTemp.getQdeReceb().setScale(4, RoundingMode.HALF_UP);
                nQdeRateioFinal = clienteTemp.getQdeFinal().setScale(4, RoundingMode.HALF_UP);
                nPercRateio = clienteTemp.getQdePerc().setScale(4, RoundingMode.HALF_UP);
                nPercRateioFinal = clienteTemp.getQdePercFinal().setScale(4, RoundingMode.HALF_UP);

                nPercRateio = nQdeRateio.divide(this.totTrans, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);
                nPercRateioFinal = nQdeRateioFinal.divide(this.totTrans, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(4, RoundingMode.HALF_UP);

                clienteTemp.setQdePerc(nPercRateio);
                clienteTemp.setQdePercFinal(nPercRateioFinal);

                clienteList.set(i, clienteTemp);

                nQdeFinal = this.clienteTemp.getQdeFinal().setScale(0, RoundingMode.HALF_UP);
                nVlrFinal = this.vlrUnit.multiply(nQdeFinal).setScale(2, RoundingMode.HALF_UP);

                this.totProposta = this.totProposta.add(this.clienteTemp.getQdeProposta()).setScale(4, RoundingMode.DOWN);;
                this.totQdeRateio = this.totQdeRateio.add(this.clienteTemp.getQdeReceb()).setScale(4, RoundingMode.HALF_UP);;
                this.totPercRateio = this.totPercRateio.add(this.clienteTemp.getQdePerc()).setScale(4, RoundingMode.HALF_UP);;
                this.totVlrRateio = this.totVlrRateio.add(this.clienteTemp.getQdeVlr()).setScale(4, RoundingMode.HALF_UP);;
                this.totQdeFinal = this.totQdeFinal.add(nQdeFinal).setScale(0, RoundingMode.HALF_UP);;
                this.totPercFinal = this.totPercFinal.add(this.clienteTemp.getQdePercFinal()).setScale(4, RoundingMode.HALF_UP);;
                this.totVlrFinal = this.totVlrFinal.add(nVlrFinal).setScale(4, RoundingMode.HALF_UP);;
            }

            this.cTotPartic = funcoes.FormataValor(this.totPartic, 4);
            this.cTotProposta = funcoes.FormataValor(this.totProposta, 0);
            this.cTotQdeRateio = funcoes.FormataValor(this.totQdeRateio, 0);
            this.cTotPercRateio = funcoes.FormataValor(this.totPercRateio, 4);
            this.cTotVlrRateio = funcoes.FormataValor(this.totVlrRateio, 2);
            this.cTotQdeFinal = funcoes.FormataValor(this.totQdeFinal, 0);
            this.cTotPercFinal = funcoes.FormataValor(this.totPercFinal, 2);
            this.cTotVlrFinal = funcoes.FormataValor(this.totVlrFinal, 2);
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "ATENÇÃO ... Erro do Sistema... ".concat(ex.getMessage()), "");
        } finally {
            Collections.sort(clienteList, comparator);
            this.clienteTrans = new Cliente();

            if (msg != null) {
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
            if (lPassa) {
                lFechar = false;
            }
            context.addCallbackParam("loggedIn", lPassa);
            context.addCallbackParam("fechar", lFechar);
        }
    }

    public List<Cliente> getSelectedCessionariosCheck() {
        return selectedCessionariosCheck;
    }

    public void setSelectedCessionariosCheck(List<Cliente> selectedCessionariosCheck) {
        this.selectedCessionariosCheck = selectedCessionariosCheck;
    }

    public void onEditRowCessionario(RowEditEvent event) {
        this.clienteTemp = (Cliente) event.getObject();

        if (this.selectedCessionariosCheck.contains(this.clienteTemp)) {
            this.selectedCessionariosCheck.remove(this.clienteTemp);
        }
    }
}
